package info.sudr.file;

import java.awt.image.BufferedImage;
import java.io.*;
import java.util.List;
import javax.imageio.ImageIO;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.imgscalr.Scalr;
import org.json.JSONArray;
import org.json.JSONObject;

public class UploadServlet extends HttpServlet {

//    private static final long serialVersionUID = 1L;
    private File fileUploadPath;

    @Override
    public void init(ServletConfig config) {
        fileUploadPath = new File(config.getInitParameter("upload_path"));
    }
        
    /**
        * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
        * 
        */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        
        if (request.getParameter("getfile") != null 
                && !request.getParameter("getfile").isEmpty()) {
            File file = new File(fileUploadPath,
                    request.getParameter("getfile"));
            if (file.exists()) {
                int bytes = 0;
                ServletOutputStream op = response.getOutputStream();

                response.setContentType(getMimeType(file));
                response.setContentLength((int) file.length());
                response.setHeader( "Content-Disposition", "inline; filename=\"" + file.getName() + "\"" );

                byte[] bbuf = new byte[1024];
                DataInputStream in = new DataInputStream(new FileInputStream(file));

                while ((in != null) && ((bytes = in.read(bbuf)) != -1)) {
                    op.write(bbuf, 0, bytes);
                }

                in.close();
                op.flush();
                op.close();
            }
        } else if (request.getParameter("delfile") != null && !request.getParameter("delfile").isEmpty()) {
            File file = new File(fileUploadPath, request.getParameter("delfile"));
            if (file.exists()) {
                file.delete(); // TODO:check and report success
            } 
        } else if (request.getParameter("getthumb") != null && !request.getParameter("getthumb").isEmpty()) {
            File file = new File(fileUploadPath, request.getParameter("getthumb"));
                if (file.exists()) {
                    String mimetype = getMimeType(file);
                    if (mimetype.endsWith("png") || mimetype.endsWith("jpeg") || mimetype.endsWith("gif")) {
                        BufferedImage im = ImageIO.read(file);
                        if (im != null) {
                            BufferedImage thumb = Scalr.resize(im, 75); 
                            ByteArrayOutputStream os = new ByteArrayOutputStream();
                            if (mimetype.endsWith("png")) {
                                ImageIO.write(thumb, "PNG" , os);
                                response.setContentType("image/png");
                            } else if (mimetype.endsWith("jpeg")) {
                                ImageIO.write(thumb, "jpg" , os);
                                response.setContentType("image/jpeg");
                            } else {
                                ImageIO.write(thumb, "GIF" , os);
                                response.setContentType("image/gif");
                            }
                            ServletOutputStream srvos = response.getOutputStream();
                            response.setContentLength(os.size());
                            response.setHeader( "Content-Disposition", "inline; filename=\"" + file.getName() + "\"" );
                            os.writeTo(srvos);
                            srvos.flush();
                            srvos.close();
                        }
                    }
            } // TODO: check and report success
        } else {
            PrintWriter writer = response.getWriter();
            writer.write("call POST with multipart form data");
        }
    }
    
    /**
        * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
        * 
        */
    @SuppressWarnings("unchecked")
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        String createby = request.getParameter("upload");
        String createdate = request.getParameter("type");
        String priority = request.getParameter("priority");
        
        //String str = "{\"val\":[{\"nda_id\":18,\"type\":\"IAA\",\"create_date\":\"20120830 08:49:07\",\"create_by\":\"GSI_APP\",\"modify_date\":\"20120830 08:49:07\",\"modify_by\":\"GSI_APP\",\"file_name\":\"GSI_APP-20120830-164910.csv\",\"status\":\"SUBMITTED\",\"priority\":null},{\"nda_id\":17,\"type\":\"IAA\",\"create_date\":\"20120830 08:48:22\",\"create_by\":\"GSI_APP\",\"modify_date\":\"20120830 08:48:22\",\"modify_by\":\"GSI_APP\",\"file_name\":\"GSI_APP-20120830-164826.csv\",\"status\":\"SUBMITTED\",\"priority\":null},{\"nda_id\":16,\"type\":\"IAA\",\"create_date\":\"20120829 08:59:46\",\"create_by\":\"GSI_APP\",\"modify_date\":\"20120829 08:59:46\",\"modify_by\":\"GSI_APP\",\"file_name\":\"GSI_APP-20120829-085945.csv\",\"status\":\"SUBMITTED\",\"priority\":null},{\"nda_id\":15,\"type\":\"IAA\",\"create_date\":\"20120829 05:06:05\",\"create_by\":\"GSI_APP\",\"modify_date\":\"20120829 05:06:05\",\"modify_by\":\"GSI_APP\",\"file_name\":\"GSI_APP-20120829-130609.csv\",\"status\":\"SUBMITTED\",\"priority\":null},{\"nda_id\":14,\"type\":\"IAA\",\"create_date\":\"20120829 05:01:18\",\"create_by\":\"GSI_APP\",\"modify_date\":\"20120829 05:01:18\",\"modify_by\":\"GSI_APP\",\"file_name\":\"GSI_APP-20120829-130121.csv\",\"status\":\"SUBMITTED\",\"priority\":3},{\"nda_id\":13,\"type\":\"IAA\",\"create_date\":\"20120828 10:32:23\",\"create_by\":\"GSI_APP\",\"modify_date\":\"20120828 10:32:23\",\"modify_by\":\"GSI_APP\",\"file_name\":\"GSI_APP-20120828-183230.csv\",\"status\":\"SUBMITTED\",\"priority\":3},{\"nda_id\":12,\"type\":\"IAA\",\"create_date\":\"20120828 10:27:30\",\"create_by\":\"GSI_APP\",\"modify_date\":\"20120828 10:27:30\",\"modify_by\":\"GSI_APP\",\"file_name\":\"GSI_APP-20120828-182737.csv\",\"status\":\"SUBMITTED\",\"priority\":3},{\"nda_id\":11,\"type\":\"IAA\",\"create_date\":\"20120828 10:18:56\",\"create_by\":\"GSI_APP\",\"modify_date\":\"20120828 10:18:56\",\"modify_by\":\"GSI_APP\",\"file_name\":\"GSI_APP-20120828-181902.csv\",\"status\":\"SUBMITTED\",\"priority\":3}],\"flag\":0}";
        String str = "{\"flag\":\"0\",\"status\":\"SUBMITTED\",\"filename\":\"GSI_APP-20120830-164910.csv\",\"destination\":\"/upload\",\"size\":\"297\"}";
        PrintWriter writer = response.getWriter();
        response.setContentType("application/json");
        writer.write(str);
        writer.close();
//        if (!ServletFileUpload.isMultipartContent(request)) {
//            throw new IllegalArgumentException("Request is not multipart, please 'multipart/form-data' enctype for your form.");
//        }
//
//        ServletFileUpload uploadHandler = new ServletFileUpload(new DiskFileItemFactory());
//        PrintWriter writer = response.getWriter();
//        response.setContentType("application/json");
//        JSONArray json = new JSONArray();
//        try {
//            List<FileItem> items = uploadHandler.parseRequest(request);
//            System.out.println(items.get(0).getString());
//            for (FileItem item : items) {
//                if (!item.isFormField()) {
//                        String test = item.getString();
//                        String fullPathName = item.getName();
//                        String fileName = fullPathName.substring(fullPathName.lastIndexOf("\\") + 1);
//                        File file = new File(fileUploadPath, fileName);
//                        String path = file.getAbsolutePath();
//                        path = file.getCanonicalPath();
//                        item.write(file);
//                        JSONObject jsono = new JSONObject();
//                        jsono.put("name", item.getName());
//                        jsono.put("size", item.getSize());
//                        jsono.put("url", "upload?getfile=" + item.getName());
//                        jsono.put("thumbnail_url", "upload?getthumb=" + item.getName());
//                        jsono.put("delete_url", "upload?delfile=" + item.getName());
//                        jsono.put("delete_type", "GET");
//                        json.put(jsono);
//                }else {
//                    String str = item.getFieldName();
//                    String str1 = item.getString();
//                    String str3 = item.getName();
//                    byte[] str2 = item.get();
//
//                }
//
//            }
//        } catch (FileUploadException e) {
//                throw new RuntimeException(e);
//        } catch (Exception e) {
//                throw new RuntimeException(e);
//        } finally {
//            writer.write(json.toString());
//            writer.close();
//        }

    }

    private String getMimeType(File file) {
        String mimetype = "";
        if (file.exists()) {
//            URLConnection uc = new URL("file://" + file.getAbsolutePath()).openConnection();
//            String mimetype = uc.getContentType();
//            MimetypesFIleTypeMap gives PNG as application/octet-stream, but it seems so does URLConnection
//            have to make dirty workaround
            if (getSuffix(file.getName()).equalsIgnoreCase("png")) {
                mimetype = "image/png";
            } else {
                javax.activation.MimetypesFileTypeMap mtMap = new javax.activation.MimetypesFileTypeMap();
                mimetype  = mtMap.getContentType(file);
            }
        }
        System.out.println("mimetype: " + mimetype);
        return mimetype;
    }



    private String getSuffix(String filename) {
        String suffix = "";
        int pos = filename.lastIndexOf('.');
        if (pos > 0 && pos < filename.length() - 1) {
            suffix = filename.substring(pos + 1);
        }
        System.out.println("suffix: " + suffix);
        return suffix;
    }
}